﻿/*
 *  ChgDoc CMS - GNU General Public License, version 3 (GPL-3.0)
 *  Copyright (C)  2012. Ian Quigley
 *  
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SqliteORM;

namespace ChgDoc.Entity
{
    [Table]
    [Serializable]
    public class Account : TableBase<Account>
    {
        public Account()
        {
            IsAnonymous = false;
        }

        [PrimaryKey(true)]
        public long Id { get; set; }

        [Field]
        public string DisplayName { get; set; }

        public bool IsAnonymous { get; private set; }

        public static Account Anonymous { get { return new Account() { IsAnonymous = true, DisplayName = "Guest" }; } }

        internal static Account Read( long id )
        {
            if (id <= 0)
                return Account.Anonymous;

            return Get( ad => ad.Read( id ) );
        }

        public static List<Account> ReadAll()
        {
            return Get(ad => ad.Select().ToList());
        }

        public static void Delete(long id)
        {
            Authentication.DeleteForAccount( id );
            Do(ad => ad.Delete(id));
        }
        
        public void RoleAdd( string roleName )
        {
            RoleAdd(Role.ForCode(roleName));
        }
        
        public void RoleAdd(Role role)
        {
            if (Id == 0)
                throw new Exception("Cannot add role to unsaved Account");

            AccountRole.Add(Id, role.Id);
        }

        public void RoleDelete( string roleName )
        {
            AccountRole.Delete( Id, Role.ForCode( roleName ).Id );
        }

        private IEnumerable<Role> _roles;
        public IEnumerable<Role> Roles
        {
            get
            {                
                return _roles ?? (_roles = Role.ForAccount( Id ));
            }
        }



        public static Account Read(int id)
        {
            return Config.Log.LogResultInfo(() => Get(ad => ad.Read(id)));
        }
    }
}
